package com.bd.scm.dao.mapper.visitor;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bd.scm.domain.dto.visitorDto.*;
import com.bd.scm.domain.models.note.Note;
import com.bd.scm.domain.models.visitor.*;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * User: _Cps
 * Date: 2020.09.14 10:27
 */
public interface VisitorMapper extends BaseMapper<VisitOrder> {

    /**
     * 各个类型配置数据
     * 200	访问基地
     * 201	证件类型
     * 202	来访事由
     * 203	访客类型
     */
    List<VisitorConfiguration> getBdSysItemList(VisitorDto visitorDto);

    /**
     * 根据基地ID 查询区域
     */
    List<VisitArea> getBdVisitAreaList(VisitorDto visitorDto);

    /**
     * 根据访客名称或者单位名称查询访客信息
     *
     * @param visitorDto vistorName 访客名称 vistorCompany 单位名称
     */
    List<VisitVistor> getVisitInfoList(VisitorDto visitorDto);

    /**
     * 根据访客名称，单位名称，手机号
     *
     * @param visitorDto vistorTel 手机号
     * @return
     */
    String getVisitInfoId(VisitorDto visitorDto);

    /**
     * 根据员工名称和员工手机号 查询人员信息
     *
     * @param visitorDto userLname 员工名称 userTelephone 员工手机号
     * @return
     */
    String getUserInfo(VisitorDto visitorDto);

    /**
     * 保存访客单
     *
     * @param jsonObject
     */
    int insertBdVisitOrder(JSONObject jsonObject);

    /**
     * 保存随访人员
     *
     * @param jsonObject
     * @return
     */
    int insertBdVisitOrderFollow(JSONObject jsonObject);

    /**
     * 保存车辆
     *
     * @param jsonObject
     * @return
     */
    int insertBdVisitOrderCar(JSONObject jsonObject);

    /**
     * 保存附件信息
     *
     * @return
     */
    int insertBdVisitOrderAttachment(JSONObject jsonObject);

    /**
     * 根据访客单ID获取附件名称集合.
     */
    List<String> getAttachmentNameList(String orderId);

    /**
     * 保存访客信息
     *
     * @param jsonObject
     * @return
     */
    int insertBdVisitVistor(JSONObject jsonObject);

    /**
     * 访客存在修改证件类型，证件号码
     *
     * @param jsonObject
     * @return
     */
    int updateVistorCert(JSONObject jsonObject);

    /**
     * 查询所有的预约记录
     *
     * @param reservationRecordDto 查询条件
     * @return
     */
    IPage<ReservationRecord> getReservationRecordList(Page<ReservationRecord> page,
                                                      ReservationRecordDto reservationRecordDto);

    /**
     * 根据ID查询人员信息
     *
     * @param userSerial
     * @return
     */
    JSONObject getUser(String userSerial);

    /**
     * 预约记录详情
     *
     * @param reservationRecordDto orderId 访客单ID
     * @return
     */
    ReservationRecordDetails getReservationRecordDetails(ReservationRecordDto reservationRecordDto);

    /**
     * 根据访客单ID查询随行人员
     *
     * @param reservationRecordDto orderId 访客单ID
     * @return
     */
    List<VisitOrderFollow> getBdVisitOrderFollowList(ReservationRecordDto reservationRecordDto);

    /**
     * 根据单子ID修改单子状态和审批人.
     *
     * @param orderId
     * @param status
     * @param approver
     */
    void updateVisitorOrder(@Param("orderId") String orderId,
                            @Param("status") Integer status,
                            @Param("approver") String approver,
                            @Param("remark") String remark);

    //微信公众号

    /**
     * 验证获取公众号opid查询是否存在
     *
     * @param wexinId 微信公众号 openid
     * @return
     */
    JSONObject getVistor(String wexinId);

    /**
     * 根据访客名称单位手机号查询访客信息公众号ID
     *
     * @param visitorRegistrationDto
     * @return
     */
    String getVistorWexinId(VisitorRegistrationDto visitorRegistrationDto);

    /**
     * 根据访客名称单位手机号修改访客信息公众号ID
     *
     * @param visitorRegistrationDto
     * @return
     */
    int updateVistorWexinId(VisitorRegistrationDto visitorRegistrationDto);

    /**
     * 短信用到 根据访客ID查询短信内容
     * visitName：访客名称
     * visitTel：访客手机号
     * employeeName：被访人名称
     * visitDateBegin：开始日期
     * visitDateEnd：结束日期
     * reason：拒绝原因
     *
     * @param orderId 访客ID
     * @return
     */
    JSONObject getNoteMessage(@Param("orderId") String orderId);

    /**
     * 根据访客信息ID查询相关内容
     *
     * @param note vistorId
     * @return
     */
    VisitVistor getOneVistor(Note note);

    /**
     * 根据员工ID查询员工信息
     *
     * @param note userId
     * @return
     */
    JSONObject getOneDtUser(Note note);

    /**
     * 根据访客名称，手机号查询访客ID
     *
     * @param note visitor 访客名称 visitTel 访客手机号
     * @return
     */
    String getVistorId(Note note);

    /**
     * 流程ID
     *
     * @param id
     * @return
     */
    int getTaskId(String id);

    /**
     * 根据访客名称，手机号查询访客微信ID-
     *
     * @param jsonObject visitName visitTel
     * @return
     */
    String getVistorWxId(JSONObject jsonObject);

    //李工同步数据用到

    /**
     * 访客单根据传过来时间获取数据
     *
     * @param dateTime 同步时间
     * @return
     */
    List<VisitOrder> findSyncVisitOrderList(@Param("dateTime") String dateTime);

    /**
     * 根据访客单ID 随行人员信息
     *
     * @param orderId 访客单ID
     * @return
     */
    List<VisitOrderFollow> findSyncFollowList(@Param("orderId") Long orderId);

    /**
     * 根据访客单ID 随行人员信息
     *
     * @param orderId 访客单ID
     * @return
     */
    List<VisitOrderCar> findSyncCarList(@Param("orderId") Long orderId);

    /**
     * 同步人员信息
     *
     * @param dateTime 时间
     * @return
     */
    List<JSONObject> findSyncUserList(@Param("dateTime") String dateTime);

    /**
     * 同步部门信息
     *
     * @return
     */
    List<JSONObject> findSyncDepList();

    /**
     * 访客登录
     *
     * @param visitorLoginDto
     * @return
     */
    JSONObject getVistorLogIn(VisitorLoginDto visitorLoginDto);

    /**
     * 判断根据访客手机号 密码登录是否查询到人
     *
     * @param visitorLoginDto
     * @return
     */
    int getVistorLogInCount(VisitorLoginDto visitorLoginDto);

    /**
     * 判断是否存在访客人员表中
     *
     * @param visitorLoginDto
     * @return
     */
    int getVistorCount(VisitorLoginDto visitorLoginDto);

    /**
     * 判断是否密码是否为空
     *
     * @param visitorLoginDto
     * @return
     */
    String getVistorPassword(VisitorLoginDto visitorLoginDto);

    /**
     * 修改访客密码
     *
     * @param visitorLoginDto vistorPassword 访客密码 visitorTel 手机号
     */
    int updateVistorPassword(VisitorLoginDto visitorLoginDto);

    /**
     * 注册访客信息
     *
     * @param visitorLoginDto
     */
    void insertRegisterBdVisitVistor(VisitorLoginDto visitorLoginDto);

    /***
     * 查询当前审批人
     * @return
     */
    String getApproverName(String approver);

    /***
     * 查询当前英文审批人
     * @return
     */
    String getApproverEnglishName(String approver);

    /**
     * 根据访客单id获取访问区域Id.
     *
     * @param orderId
     * @return
     */
    Integer getAreaIdByOrder(Integer orderId);

    /**
     * 根据区域id获取需要二级审批的区域记录数.
     *
     * @param areaId
     * @return
     */
    Integer getIsSecondApproveByAreaId(@Param("areaId") Integer areaId);

    /**
     * 根据区域id获取区域负责人（二级审批人）.
     *
     * @param areaId
     * @return
     */
    List<String> getSecondApproverByAreaId(@Param("areaId") Integer areaId);

    /**
     * 根据区域id获取区域负责人多个信息（二级审批人）.
     *
     * @param areaId
     * @return
     */
    List<JSONObject> getSecondApproverInfoByAreaId(@Param("areaId") Integer areaId);

    /**
     * 查询访客报表预约记录
     *
     * @param visitorsReportDto 查询条件
     * @return
     */
    IPage<VisitorsReport> findVisitList(Page<VisitorsReport> page, VisitorsReportDto visitorsReportDto);

    /**
     * 导出访客报表预约记录
     *
     * @param visitorsReportDto
     * @return
     */
    List<VisitorsReportExport> exportVisitList(@Param("param2") VisitorsReportDto visitorsReportDto);

    /**
     * 车辆进出记录报表
     * @param visitSmartCartempDto 查询条件
     * @return
     */
    IPage<VisitSmartCartemp> findSmartCartempList(Page<VisitSmartCartemp> page, VisitSmartCartempDto visitSmartCartempDto);

    /**
     * 导出车辆进出记录报表
     *
     * @param visitSmartCartempDto
     * @return
     */
    List<VisitSmartCartempExport> exportSmartCartempList(@Param("param2") VisitSmartCartempDto visitSmartCartempDto);

    /**
     * 各个基地车辆实时情况以及总合计
     * @param baseId 基地ID
     * @return
     */
    List<VehicleUsage> getVehicleUsage(@Param("baseId") String baseId,@Param("placeIds") String placeIds);

    /**
     * 各个基地车辆实时情况以及总合计图形情况
     * @param vehicleUsageGraphDto
     * @return
     */
    String getVehicleUsageGraph(VehicleUsageGraphDto vehicleUsageGraphDto);

    /**
     * 访客实时访问基地情况以及总基地情况
     * @param visitorVisitDto
     * @return
     */
    List<VisitorVisit> getVisitorVisitCase(VisitorVisitDto visitorVisitDto);

    /**
     * 访客实时访问基地情况以及总基地图形情况
     * @param visitorVisitDto
     * @return
     */
    List<VisitorVisit> getVisitorVisitGraphCase(VisitorVisitDto visitorVisitDto);

    /**
     * 查询某个日期到访人数
     * @param visitorVisitDto
     * @return
     */
    VisitorVisit getVisitorItemsCount(VisitorVisitDto visitorVisitDto);

    //访客单位访问统计

    /**
     * 获取所有部门
     */
    List<JSONObject> getDtdepList();

    /**
     * 1.按月查询
     * @param visitorUnitDto
     * @return
     */
    List<JSONObject> getVisitorUnitMonth(VisitorUnitDto visitorUnitDto);

    /**
     * 2.按季度查询
     * @param visitorUnitDto
     * @return
     */
    List<JSONObject> getVisitorUnitQuarter(VisitorUnitDto visitorUnitDto);

    /**
     * 3.按年查询
     * @param visitorUnitDto
     * @return
     */
    List<JSONObject> getVisitorUnitYear(VisitorUnitDto visitorUnitDto);

    //访客单位人次统计

    /**
     * 1.按月查询 公司分组
     * @param visitorUnitDto
     * @return
     */
    List<JSONObject> getVisitorUnitManTimeMonth(VisitorUnitDto visitorUnitDto);

    /**
     * 2.按季度查询 公司分组
     * @param visitorUnitDto
     * @return
     */
    List<JSONObject> getVisitorUnitManTimeQuarter(VisitorUnitDto visitorUnitDto);

    /**
     * 3.按年查询 公司分组
     * @param visitorUnitDto
     * @return
     */
    List<JSONObject> getVisitorUnitManTimeYear(VisitorUnitDto visitorUnitDto);

    /**
     * 访客公司名称
     * @return
     */
    List<JSONObject> getVisitCompanyList();

    //被访者部门人次统计

    /**
     * 1.按月查询
     * @param visitorUnitDto
     * @return
     */
    List<JSONObject> getDtDepManTimeMonth(VisitorUnitDto visitorUnitDto);

    /**
     * 2.按季度查询
     * @param visitorUnitDto
     * @return
     */
    List<JSONObject> getDtDepManTimeQuarter(VisitorUnitDto visitorUnitDto);

    /**
     * 3.按年查询
     * @param visitorUnitDto
     * @return
     */
    List<JSONObject> getDtDepManTimeYear(VisitorUnitDto visitorUnitDto);

    //导出被访者部门人次统计

    /**
     * 1.按月查询
     * @param visitorUnitDto
     * @return
     */
    List<DtDepManTime> exportDtDepManTimeMonth(VisitorUnitDto visitorUnitDto);

    /**
     * 2.按季度查询
     * @param visitorUnitDto
     * @return
     */
    List<DtDepManTime> exportDtDepManTimeQuarter(VisitorUnitDto visitorUnitDto);

    /**
     * 3.按年查询
     * @param visitorUnitDto
     * @return
     */
    List<DtDepManTime> exportDtDepManTimeYear(VisitorUnitDto visitorUnitDto);

}
